package com.liru.chat_demo.model;

import java.util.Map;
import java.util.Objects;

/**
 * 模型类，表示一个MCP工具
 */
public class McpTool {
    // 工具的唯一标识符
    private String id;
    // 服务器ID
    private String serverId;
    // 工具名称
    private String name;
    // 在服务器上的工具名称
    private String toolNameOnServer;
    // 工具描述
    private String description;
    // 参数模式定义
    private Map<String, Object> paramSchema;
    // 是否暴露给用户使用
    private boolean exposed;

    // 无参构造函数
    public McpTool() {
    }

    // 带参数的构造函数，用于创建MCP工具实例
    public McpTool(String serverId, String name, String toolNameOnServer, String description, Map<String, Object> paramSchema) {
        // 设置服务器ID
        this.serverId = serverId;
        // 设置工具名称
        this.name = name;
        // 设置在服务器上的工具名称
        this.toolNameOnServer = toolNameOnServer;
        // 设置工具描述
        this.description = description;
        // 设置参数模式
        this.paramSchema = paramSchema;
        // 默认设置为暴露状态
        this.exposed = true;
        // 根据服务器ID和名称生成唯一标识符
        this.id = serverId + ":" + name;
    }

    // 获取工具的唯一标识符
    public String getId() {
        return id;
    }

    // 设置工具的唯一标识符
    public void setId(String id) {
        this.id = id;
    }

    // 获取服务器ID
    public String getServerId() {
        return serverId;
    }

    // 设置服务器ID
    public void setServerId(String serverId) {
        this.serverId = serverId;
    }

    // 获取工具名称
    public String getName() {
        return name;
    }

    // 设置工具名称
    public void setName(String name) {
        this.name = name;
    }

    // 获取在服务器上的工具名称
    public String getToolNameOnServer() {
        return toolNameOnServer;
    }

    // 设置在服务器上的工具名称
    public void setToolNameOnServer(String toolNameOnServer) {
        this.toolNameOnServer = toolNameOnServer;
    }

    // 获取工具描述
    public String getDescription() {
        return description;
    }

    // 设置工具描述
    public void setDescription(String description) {
        this.description = description;
    }

    // 获取参数模式定义
    public Map<String, Object> getParamSchema() {
        return paramSchema;
    }

    // 设置参数模式定义
    public void setParamSchema(Map<String, Object> paramSchema) {
        this.paramSchema = paramSchema;
    }

    // 检查工具是否暴露给用户使用
    public boolean isExposed() {
        return exposed;
    }

    // 设置工具是否暴露给用户使用
    public void setExposed(boolean exposed) {
        this.exposed = exposed;
    }

    // 重写equals方法，用于比较两个McpTool对象是否相等
    @Override
    public boolean equals(Object o) {
        // 如果是同一个对象，直接返回true
        if (this == o) return true;
        // 如果对象为空或类不同，返回false
        if (o == null || getClass() != o.getClass()) return false;
        // 类型转换
        McpTool mcpTool = (McpTool) o;
        // 比较ID是否相等
        return Objects.equals(id, mcpTool.id);
    }

    // 重写hashCode方法，用于计算对象的哈希值
    @Override
    public int hashCode() {
        // 根据ID计算哈希值
        return Objects.hash(id);
    }

    // 重写toString方法，用于返回对象的字符串表示
    @Override
    public String toString() {
        // 返回包含所有属性的字符串
        return "McpTool{" +
                "id='" + id + '\'' +
                ", serverId='" + serverId + '\'' +
                ", name='" + name + '\'' +
                ", toolNameOnServer='" + toolNameOnServer + '\'' +
                ", description='" + description + '\'' +
                ", exposed=" + exposed +
                '}';
    }
}